//
// Created by LanK on 2024/12/29.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 100000

// 栈结构体定义
typedef struct {
    int data[MAX_SIZE];  // 存储栈的元素
    int top;              // 栈顶索引
} Stack;

// 初始化栈
void initStack(Stack* stack) {
    stack->top = -1;  // 栈初始化为空
}

// 判断栈是否为空
int isEmpty(Stack* stack) {
    return stack->top == -1;
}

// 入栈操作
void push(Stack* stack, int x) {
    stack->data[++stack->top] = x;
}

// 出栈操作
void pop(Stack* stack) {
    if (!isEmpty(stack)) {
        stack->top--;  // 弹出栈顶元素
    }
}

// 查询栈顶元素
int query(Stack* stack) {
    if (!isEmpty(stack)) {
        return stack->data[stack->top];
    }
    return -1;  // 栈为空时，返回-1（尽管不会遇到这种情况）
}

// 判断栈是否为空并输出结果
void empty(Stack* stack) {
    if (isEmpty(stack)) {
        printf("YES\n");
    } else {
        printf("NO\n");
    }
}

// 主函数
int main() {
    int M;
    scanf("%d", &M);  // 输入操作次数

    Stack stack;
    initStack(&stack);  // 初始化栈

    char command[20];  // 用于读取命令
    int x;

    for (int i = 0; i < M; i++) {
        scanf("%s", command);  // 读取操作命令

        if (strcmp(command, "push") == 0) {
            scanf("%d", &x);  // 读取压入栈的元素
            push(&stack, x);
        } else if (strcmp(command, "pop") == 0) {
            pop(&stack);
        } else if (strcmp(command, "empty") == 0) {
            empty(&stack);
        } else if (strcmp(command, "query") == 0) {
            printf("%d\n", query(&stack));
        }
    }

    return 0;
}
